/********************************************************************************
 * Project Name		[JavaSE_Fundamentals]
 * File Name     	[TestFileInputOutputStream.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package io.api;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * java.io.FileInputStream测试<br/>
 * java.io.FileOutputSteam测试<br/>
 * 
 * 使用FileOutputStream时<br/>
 * 如果目标文件不存在, 那么会自动创建目标文件对象<br/>
 * 如果目标文件已经存在, 那么会先清空目标文件中的数据, 然后再写入数据<br/>
 * 如果目标文件已经存在, 需要追加数据时应使用new FileOutputStream(file,true)构造方法<br/>
 * 如果使用write方法写数据时, 虽然接收的是一个int类型的数据, 但真正写出的只是一个字节的数据, 只是把低八位的二进制数据写出,
 * 其他二十四位数据全部丢弃<br/>
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
public class TestFileInputOutputStream {

	/**
	 * 使用FileInputStream & FileOutputStream拷贝文件
	 * 
	 * @param fileSource
	 * @param fileDest
	 */
	public static void copyFileByFileStream(String fileSource, String fileDest) {
		FileInputStream in = null;
		FileOutputStream out = null;

		try {
			in = new FileInputStream(fileSource);
			out = new FileOutputStream(fileDest);

			byte[] buffer = new byte[2048];
			int length = 0;
			while ((length = in.read(buffer)) != -1) {
				// 没有length属性会出现旧数据的问题
				// 比如读取数据aaaa,bbb, 没有length属性的读取结果为aaaa,bbba
				out.write(buffer, 0, length);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 注意异常的处理方式
			try {
				// 先关闭输出流, 再关闭输入流
				if (out != null) {
					out.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			} finally {
				try {
					if (in != null) {
						in.close();
					}
				} catch (IOException e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
			}
		}
	}
}
